package com.demo.java.OD401_450.OD417;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【会议室占用时间(C&D卷)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146258036
 */
public class OdMain {
    // 合并会议的函数
    public static List<int[]> mergeMeetings(int[][] meetings) {
        if (meetings == null || meetings.length == 0) {
            return new ArrayList<>();
        }

        // 先按照开始时间对会议进行排序
        Arrays.sort(meetings, Comparator.comparingInt(a -> a[0]));

        List<int[]> mergedMeetings = new ArrayList<>();
        mergedMeetings.add(meetings[0]);  // 将第一个会议添加到结果中

        for (int i = 1; i < meetings.length; i++) {
            int[] currentMeeting = meetings[i];
            int[] lastMeeting = mergedMeetings.get(mergedMeetings.size() - 1);

            // 如果当前会议的开始时间在上一个会议的结束时间之前或者相同，合并两个会议
            if (currentMeeting[0] <= lastMeeting[1]) {
                lastMeeting[1] = Math.max(lastMeeting[1], currentMeeting[1]);  // 更新结束时间为两个会议的最大结束时间
            } else {
                // 否则，当前会议与上一个会议不重叠，直接添加到结果中
                mergedMeetings.add(currentMeeting);
            }
        }

        return mergedMeetings;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 提示用户输入会议时间的JSON数组字符串（例如：[ [1,4], [2,5], [7,9], [14,18] ]）
        System.out.println("请输入会议时间的JSON数组（例如：[[1,4],[2,5],[7,9],[14,18]]）：");
        String inputJson = scanner.nextLine();

        // 手动解析输入的JSON字符串为二维数组
        // 去除外层的[]，并按逗号分割每个会议的开始和结束时间
        inputJson = inputJson.trim();

        // 去掉最外层的 [ ] 符号
        inputJson = inputJson.substring(2, inputJson.length() - 2);

        // 按 "],[" 分割每个会议的开始和结束时间
        String[] meetingsStr = inputJson.split("],\\[");

        // 创建二维数组存储会议时间
        int[][] meetings = new int[meetingsStr.length][2];
        for (int i = 0; i < meetingsStr.length; i++) {
            String[] times = meetingsStr[i].split(",");
            meetings[i][0] = Integer.parseInt(times[0].trim());
            meetings[i][1] = Integer.parseInt(times[1].trim());
        }

        // 调用mergeMeetings函数合并会议
        List<int[]> mergedMeetings = mergeMeetings(meetings);

        // 输出合并后的会议时间，格式为JSON样式
        System.out.print("合并后的会议时间: [");
        for (int i = 0; i < mergedMeetings.size(); i++) {
            System.out.print("[" + mergedMeetings.get(i)[0] + "," + mergedMeetings.get(i)[1] + "]");
            if (i < mergedMeetings.size() - 1) {
                System.out.print(",");
            }
        }
        System.out.println("]");
    }
}
